package org.convallaria.system.biz.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.convallaria.infrastruct.db.entity.BaseEntity;

import java.time.LocalDateTime;

/**
 * 系统用户实体类
 * 
 * 功能特性：
 * - 支持多租户数据隔离
 * - 支持软删除机制
 * - 支持乐观锁并发控制
 * - 支持数据审计追踪
 * - 支持用户状态管理
 * - 支持部门关联
 * - 支持登录信息记录
 * 
 * 业务规则：
 * - 用户账号在租户内唯一
 * - 支持多种用户类型（系统用户、外部用户等）
 * - 支持用户状态控制（正常、停用）
 * - 支持性别、头像等个人信息管理
 * - 支持最后登录信息追踪
 * - 密码加密存储，不参与序列化
 * 
 * @author convallaria
 * @since 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_user")
public class SysUser extends BaseEntity {

    /**
     * 用户ID
     * 主键，自增长
     */
    @TableId(value = "user_id")
    private Long userId;

    /**
     * 部门ID
     * 关联sys_dept表，支持用户部门归属
     */
    @TableField("dept_id")
    private Long deptId;

    /**
     * 用户账号
     * 用户登录时使用的唯一标识，在租户内唯一
     */
    @TableField("user_name")
    private String userName;

    /**
     * 用户昵称
     * 用户显示名称，支持中文
     */
    @TableField("nick_name")
    private String nickName;

    /**
     * 真实姓名
     * 用户显示姓名，支持中文
     */
    @TableField("real_name")
    private String realName;

    /**
     * 用户类型
     * 00=系统用户，01=外部用户，02=API用户
     */
    @TableField("user_type")
    private String userType;

    /**
     * 用户邮箱
     * 用于找回密码、接收通知等
     */
    @TableField("email")
    private String email;

    /**
     * 手机号码
     * 用于短信验证、接收通知等
     */
    @TableField("phone_number")
    private String phoneNumber;

    /**
     * 用户性别
     * 0=男，1=女，2=未知
     */
    @TableField("gender")
    private String gender;

    /**
     * 出生日期
     * 格式：yyyy-MM-dd
     */
    @TableField("birthday")
    private String birthday;

    /**
     * 头像地址
     * 用户头像URL路径
     */
    @TableField("avatar")
    private String avatar;

    /**
     * 密码
     * 加密存储，不参与JSON序列化
     */
    @TableField("password")
    @com.fasterxml.jackson.annotation.JsonIgnore
    private String password;

    /**
     * 帐号状态
     * 0=正常，1=停用
     */
    @TableField("status")
    private String status;

    /**
     * 最后登录IP
     * 记录用户最后一次登录的IP地址
     */
    @TableField("login_ip")
    private String loginIp;

    /**
     * 最后登录时间
     * 记录用户最后一次登录的时间
     */
    @TableField("login_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime loginTime;

    /**
     * 租户ID
     * 多租户数据隔离标识
     */
    @TableField("tenant_id")
    private Long tenantId;

    /**
     * 部门名称
     * 冗余字段，提高查询性能
     */
    @TableField("dept_name")
    private String deptName;
}